#ifndef OTA_H
#define OTA_H

#include <stdbool.h>
#include <stdint.h>

// OTA模块错误码
#define OTA_SUCCESS        0
#define OTA_ERROR_INIT     -1
#define OTA_ERROR_DOWNLOAD -2
#define OTA_ERROR_VERIFY   -3
#define OTA_ERROR_UPDATE   -4
#define OTA_ERROR_CANCEL   -5

// OTA状态
enum ota_status {
    OTA_STATUS_IDLE,
    OTA_STATUS_DOWNLOADING,
    OTA_STATUS_VERIFYING,
    OTA_STATUS_UPDATING,
    OTA_STATUS_REBOOTING,
    OTA_STATUS_COMPLETED,
    OTA_STATUS_FAILED
};

// OTA信息结构体
typedef struct {
    char version[32];
    char url[256];
    uint64_t file_size;
    char md5[33];
    char description[512];
} ota_info_t;

// OTA更新进度
typedef struct {
    enum ota_status status;
    uint64_t downloaded_size;
    uint64_t total_size;
    int error_code;
    char error_msg[128];
} ota_progress_t;

/**
 * @brief 初始化OTA模块
 * @return 成功返回OTA_SUCCESS，失败返回错误码
 */
int ota_init(void);

/**
 * @brief 清理OTA模块资源
 */
void ota_cleanup(void);

/**
 * @brief 启动OTA线程（用于主函数中创建线程）
 * @param arg 线程参数（未使用）
 * @return NULL
 */
void *ota_thread_func(void *arg);

/**
 * @brief 检查更新
 * @param info 输出参数，用于存储OTA信息
 * @return 有更新返回1，无更新返回0，失败返回-1
 */
int ota_check_update(ota_info_t *info);

/**
 * @brief 开始OTA更新
 * @param info OTA信息
 * @return 成功返回OTA_SUCCESS，失败返回错误码
 */
int ota_start_update(ota_info_t *info);

/**
 * @brief 取消OTA更新
 * @return 成功返回OTA_SUCCESS，失败返回错误码
 */
int ota_cancel_update(void);

/**
 * @brief 获取OTA进度
 * @param progress 输出参数，用于存储OTA进度
 * @return 成功返回OTA_SUCCESS，失败返回错误码
 */
int ota_get_progress(ota_progress_t *progress);

/**
 * @brief 获取当前固件版本
 * @param version 输出参数，用于存储版本号
 * @return 成功返回OTA_SUCCESS，失败返回错误码
 */
int ota_get_current_version(char *version, int max_len);

// OTA事件回调函数类型
typedef void (*ota_event_cb)(enum ota_status status, void *data, void *user_data);

/**
 * @brief 注册OTA事件回调函数
 * @param callback 回调函数指针
 * @param user_data 用户数据
 */
void ota_register_event_callback(ota_event_cb callback, void *user_data);

#endif /* OTA_H */